#ifndef __PH_MB_SLAVE_H__
#define __PH_MB_SLAVE_H__

#include "cbb_ph_obj.h"
#include <stdint.h>

// MODBUS SLAVE 数据结构
typedef struct MB_Slave_Data{
    uint8_t u8Addr;         // 设备地址
    uint8_t u8FuncCode;     // 功能码
    uint16_t u16StartReg;   // 起始寄存器
    uint16_t u16RegCount;   // 寄存器个数
    uint16_t u16Data;       // 数据
}MB_Slave_Data_t;

// MODBUS MASTER 对象
typedef struct PH_MB_Slave{
    MB_Slave_Data_t stData;         // modbus 数据备份
    uint16_t* pu16HoldingRegs;      // 保持寄存器
    uint16_t* pu16InputRegs;        // 输入寄存器
    uint16_t u16HoldingRegsSize;    // 保持寄存器大小
    uint16_t u16InputRegsSize;      // 输入寄存器大小
    uint8_t u8Addr;
}PH_MB_Slave_t;

/**
 * @brief 注册 modbus slave 协议
 * @param pstSelf 协议上下文特征对象
 * @param fCheck 校验函数
 * @param fAppend 追加函数
 * @return PH_t* 协议对象
 */
PH_REG_DEC(cbb_mb_slave, PH_MB_Slave_t)

/**
 * @brief 构建 modbus slave 构建报文
 * @param pstPHObj 协议对象
 * @param pstTxBuffer 发送缓存
 * @return @see PH_RET_t
 */
PH_RET_t 
cbb_mb_slave_build(PH_t* pstPHObj, PH_Buf_t* pstTxBuffer);

/**
 * @brief 解析 modbus slave 解析报文
 * @param pstPHObj 协议对象
 * @param pstRxBuffer 接收缓存
 * @return @see PH_RET_t
 */
PH_RET_t 
cbb_mb_slave_parse(PH_t* pstSelf,PH_Buf_t* pstRxBuffer);

/**
 * @brief 设置 modbus slave 设备地址
 * @param pstSelf 协议对象
 * @param u8Addr 设备地址
 * @return @see PH_RET_t
 */
PH_RET_t
cbb_mb_slave_set_addr(PH_t* pstSelf, uint8_t u8Addr);

#endif /* __PH_MB_SLAVE_H__ */
